package qualomelhor.gwt.modules.client;

import java.util.ArrayList;

import qualomelhor.database.TermoIdioma;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.ClickEvent;

public class EditarTermoIdioma implements EntryPoint {
	private Label lbId;
	private TextBox txtNomeTermo;
	private TextBox txtLocale;
	private TextBox txtTraducao;
	private CheckBox ckLocaleFirst;
	private CheckBox ckSomenteSemTraducao;

	private int posReg = 0;
	private ISessionSuportServiceAsync serviceSupportSvc = GWT.create(ISessionSuportService.class);
	private Label lbNumRegistro;
	private ArrayList<TermoIdioma> listTermos;

	private int offset = 0;
	private int limit = 100;
	private boolean localeFirst = false;
	private boolean somenteSemTraducao = false;

	public static native void showDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="block";
		$doc.getElementById("divBloqueioSolido").style.display="block";
	}-*/;

	public static native void hideDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="none";
		$doc.getElementById("divBloqueioSolido").style.display="none";
	}-*/;

	@Override
	public void onModuleLoad() {
		Window.alert("Iniciando edicao TermoIdioma..");
		carregaListaTermos(offset, limit, false, false);	
	}

	private void carregaFormEditar() {
		System.out.println("listProdutos.size = " + listTermos.size());
		System.out.println("listCategorias.size = " + listTermos.size());
		RootPanel rootPanel = RootPanel.get("divCadastro");
		rootPanel.clear();
		//rootPanel.getElement().getStyle().setPosition(Position.RELATIVE);

		VerticalPanel verticalPanel = new VerticalPanel();
		rootPanel.add(verticalPanel);
		verticalPanel.setSize("500px", "300px");

		HorizontalPanel horizontalPanelNav = new HorizontalPanel();
		verticalPanel.add(horizontalPanelNav);

		Button btnNovaCategoria = new Button("Novo");
		btnNovaCategoria.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				novo();
			}
		});
		horizontalPanelNav.add(btnNovaCategoria);

		Button btnAnterior = new Button("Anterior");
		btnAnterior.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg >= 0) {
					posReg--;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnAnterior);

		Button btnProximo = new Button("Proximo");
		btnProximo.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg < listTermos.size()) {
					posReg++;
				}
				atualiza();
			}
		});
		horizontalPanelNav.add(btnProximo);

		Button btnProximoSet = new Button("Proximo SET");
		horizontalPanelNav.add(btnProximoSet);
		btnProximoSet.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				offset += limit;
				carregaListaTermos(offset, limit, localeFirst, somenteSemTraducao);
			}
		});

		Button btnSalvar = new Button("Salvar");
		horizontalPanelNav.add(btnSalvar);
		btnSalvar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				Long idTermo = (lbId.getText().equals("")?0L:Long.parseLong(lbId.getText()));
				salvaTermoIdioma(idTermo, txtNomeTermo.getText(), txtLocale.getText(), txtTraducao.getText());
			}
		});

		Button btnDeletar = new Button("Deletar");
		btnDeletar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (posReg != -1 && posReg < listTermos.size()) {
					deletaTermo(listTermos.get(posReg).getId());
				} else {
					Window.alert("nao da pra deletar o registro novo..");
				}
			}
		});
		horizontalPanelNav.add(btnDeletar);

		Label lbLocaleFirst = new Label("Locale First:");
		horizontalPanelNav.add(lbLocaleFirst);

		ckLocaleFirst = new CheckBox();
		horizontalPanelNav.add(ckLocaleFirst);
		ckLocaleFirst.setValue(localeFirst);
		ckLocaleFirst.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				localeFirst = ckLocaleFirst.getValue();
				carregaListaTermos(offset, limit, localeFirst, somenteSemTraducao);
			}
		});
		
		ckSomenteSemTraducao = new CheckBox();
		horizontalPanelNav.add(ckSomenteSemTraducao);
		ckSomenteSemTraducao.setValue(somenteSemTraducao);
		ckSomenteSemTraducao.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				somenteSemTraducao = ckSomenteSemTraducao.getValue();
				carregaListaTermos(offset, limit, localeFirst, somenteSemTraducao);				
			}
		});

		lbNumRegistro = new Label("");
		horizontalPanelNav.add(lbNumRegistro);

		FlexTable tbCadastro = new FlexTable();
		verticalPanel.add(tbCadastro);

		Label lblNewLabel = new Label("Id:");
		tbCadastro.setWidget(0, 0, lblNewLabel);

		lbId = new Label("");
		tbCadastro.setWidget(0, 1, lbId);

		Label lblNewLabel_1 = new Label("Nome Termo:");
		tbCadastro.setWidget(1, 0, lblNewLabel_1); 
		lblNewLabel_1.setSize("138", "16");

		txtNomeTermo = new TextBox();
		txtNomeTermo.setWidth("500px");
		tbCadastro.setWidget(1, 1, txtNomeTermo);

		Label lblNewLabel_3 = new Label("Locale:");
		tbCadastro.setWidget(3, 0, lblNewLabel_3);
		lblNewLabel_3.setSize("138", "16");

		txtLocale = new TextBox();
		tbCadastro.setWidget(3, 1, txtLocale);

		txtTraducao = new TextBox();
		tbCadastro.setWidget(4, 1, txtTraducao);
		txtTraducao.setWidth("500px");

		posReg = 0;
		atualiza();
	}

	private void novo() {
		lbNumRegistro.setText("Novo Registro");
		lbId.setText("");
		txtNomeTermo.setText("");
		txtLocale.setText("");
		txtTraducao.setText("");
	}

	private void atualiza() {
		if (posReg == -1 || posReg == listTermos.size()) {
			novo();
		} else {
			lbNumRegistro.setText("Registro " + (posReg + 1) + " de " + listTermos.size());
			lbId.setText(listTermos.get(posReg).getId().toString());
			txtNomeTermo.setText(listTermos.get(posReg).getTermo());
			txtLocale.setText(String.valueOf(listTermos.get(posReg).getLocale()));
			txtTraducao.setText(String.valueOf(listTermos.get(posReg).getTraducao()));
		}
	}

	private void deletaTermo(final Long id) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {			
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});
		
		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					//carregaListaTermos(offset, limit, localeFirst);
					if (listTermos.get(posReg).getId().equals(id)) {
						listTermos.remove(posReg);
						atualiza();
					}
				}
			}
		};
		serviceSupportSvc.deletaTermoIdioma(id, callback);
	}

	void carregaListaTermos (int offset, int limit, boolean localeFirst, boolean somenteSemTraducao) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<ArrayList<TermoIdioma>> callback = new AsyncCallback<ArrayList<TermoIdioma>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(ArrayList<TermoIdioma> result) {
				listTermos = result;
				carregaFormEditar();
			}
		};

		serviceSupportSvc.getListTermoIdioma(offset, limit, localeFirst, somenteSemTraducao, callback);
	}

	private void salvaTermoIdioma(final Long id, String nomeTermo, final String locale, final String traducao) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				if (!b) {
					Window.alert("Erro ao tentar gravar! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				} else {
					for (int i = 0; i < listTermos.size(); i++) {
						if (listTermos.get(i).getId().equals(id)) {
							listTermos.get(i).setLocale(locale);
							listTermos.get(i).setTraducao(traducao);
							Window.alert("Salvo");
						}
					}
				}
			}
		};
		serviceSupportSvc.gravaTermoIdioma(id, nomeTermo, locale, traducao, callback);
	}
}